package com.hksj.Intelligentmanagement.common;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import lombok.ToString;

import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;


@Data
@ToString
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Result extends LinkedHashMap<String,Object> implements Serializable {
    private static final long serialVersionUID = 1L;
//    private int resultCode;
//    private String message;
//    private Object data;
//
//    public Result(){
//
//    }
//
//    public Result(int resultCode, String message){
//        this.resultCode = resultCode;
//        this.message = message;
//    }
//
//    public Result(int resultCode, String message,Object data){
//        this.resultCode = resultCode;
//        this.message = message;
//        this.data=data;
//    }
//
//    // 服务器处理失败
//    public Result failure(){
//        return new Result(Constants.RESULT_CODE_SERVER_ERROR, "服务器错误");
//    }
    /**
     * 构建
     */
    public Result(){

    }

    /**
     * 构造函数
     * @param code 状态码
     * @param msg 信息
     * @param data 数据
     */
    public Result(int code, String msg,Object data){
        this.setCode(code);
        this.setMsg(msg);
        this.setData(data);
    }

    public Result(int code,String msg){
        this.setCode(code);
        this.setMsg(msg);
    }

    /**
     * 根据map快速构建
     * @param map map
     */
    public Result(Map<String,Object> map) {
        for (String key : map.keySet()) {
            this.set(key,map.get(key));
        }
    }

    /**
     * 获取code
     * @return code
     */
    public Integer getCode(){
        return (Integer) this.get("code");
    }

    /**
     * 获取msg
     * @return msg
     */
    public String getMsg(){
        return (String)this.get("msg");
    }

    /**
     * 获取data
     * @return data
     */
    public Object getData(){
        return (Object) this.get("data");
    }

    /**
     * 给code赋值,连缀风格
     * @param code code
     * @return 对象自身
     */
    public Result setCode(int code){
        this.put("code",code);
        return this;
    }

    /**
     * 给msg赋值,连缀风格
     * @param msg msg
     * @return 对象自身
     */
    public Result setMsg(String msg){
        this.put("msg",msg);
        return this;
    }

    /**
     * 给data赋值,连缀风格
     * @param data data
     * @return 对象自身
     */
    public Result setData(Object data){
        //若data为空则直接返回空数组
        if (Objects.isNull(data)){
            data = new String[0];
        }
        this.put("data",data);
        return this;
    }

    /**
     * 写入一个值 自定义key,连缀风格
     * @param key key
     * @param data data
     * @return 对象自身
     */
    public Result set(String key, Object data){
        this.put(key, data);
        return this;
    }

    /**
     * 写一个map,连缀风格
     * @param map map
     * @return 对象自身
     */
    public Result setMap(Map<String, ?> map) {
        for (String key : map.keySet()) {
            this.put(key,map.get(key));
        }
        return this;
    }

    //======================================构建======================================

    //若msg为空返回'',若data为空则返回空数组,返回null的话前端还需要再进行判断
    //构建成功
    public static Result ok(){
        return new Result(Constants.RESULT_CODE_SUCCESS,Constants.DEFAULT_SUCCESS_MESSAGE, new String[0]);
    }

    public static Result ok(String msg){
        return new Result(Constants.RESULT_CODE_SUCCESS,msg,new String[0]);
    }

    public static Result ok(Object data){
        return new Result(Constants.RESULT_CODE_SUCCESS,Constants.DEFAULT_SUCCESS_MESSAGE,data);
    }

    public static Result ok(int code){
        return new Result(code,"",new String[0]);
    }

    public static Result data(Object data){
        return new Result(Constants.RESULT_CODE_SUCCESS,Constants.DEFAULT_SUCCESS_MESSAGE,data);
    }

    //构建失败
    public static Result error(){
        return new Result(Constants.RESULT_CODE_SERVER_ERROR,Constants.DEFAULT_FAIL_MESSAGE,new String[0]);
    }

    public static Result error(String msg){
        return new Result(Constants.RESULT_CODE_SERVER_ERROR,msg,new String[0]);
    }

    //构建指定状态码
    public static Result get(int code, String msg, Object data){
        return new Result(code,msg,data);
    }

    //构建指定状态码
    public static Result get(int code,String msg){
        return new Result(code,msg);
    }
}
